package com.zjsru.plan2024.normal;

/**
 * 861. 翻转矩阵后的得分
 * @Author: cookLee
 * @Date: 2024-10-09
 */
public class MatrixScore {

    /**
     * 主:一次 移动 是指选择任一行或列，并转换该行或列中的每一个值：将所有 0 都更改为 1，将所有 1 都更改为 0。
     * \
     * 输入：grid = [[0,0,1,1],[1,0,1,0],[1,1,0,0]]
     * 输出：39
     * 解释：0b1111 + 0b1001 + 0b1111 = 15 + 9 + 15 = 39
     * \
     *
     * @param args args
     */
    public static void main(String[] args) {
        MatrixScore matrixScore = new MatrixScore();
        int[][] grid = new int[][]{{0,0,1,1},{1,0,1,0},{1,1,0,0}};
        System.out.println(matrixScore.matrixScore(grid));
    }

    /**
     * 矩阵得分:贪心
     *
     * @param grid 网格
     * @return int
     */
    public int matrixScore(int[][] grid) {
        int ans = 0;
        int len = grid.length, colLen = grid[0].length;
        //每行矩阵开头1才能最大化数据
        ans = len * (1 << (colLen - 1));
        for (int i = 1; i < colLen; i++) {
            //计算每一列的最大值
            int res = 0;
            for (int[] ints : grid) {
                //判断每行是否反转过开头
                if (ints[0] == 1) {
                    res += ints[i];
                } else {
                    //即如果是1不计入单位，如果是0则计入
                    res += (1 - ints[i]);
                }
            }
            //判断需要反转的位数最大
            int k = Math.max(res, len - res);
            //当前列是第几位，获取对应的值 100,10,1等
            ans += k * (1 << (colLen - i - 1));
        }
        return ans;
    }

}
